package ar.com.arkios.kfconTraductor;

import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;
import org.apache.log4j.Logger;

/**
 * 
 */
public class ClientHandler extends Thread {

    private static final Logger miLogger = Logger.getLogger(ClientHandler.class);
    
    private Socket socket;
    
    private Protocolo protocolo;
    
    private boolean activo;
    
    public ClientHandler(Socket socket) {
        this.activo = true;
        this.socket = socket;
        this.protocolo = new Protocolo();
    }
    
    public ClientHandler(Socket socket, Protocolo protocolo) {
        this.activo = true;
        this.socket = socket;
        this.protocolo = protocolo;
    }

    @Override
    public void run() {
        try {
            String comando = protocolo.read(socket);
            miLogger.debug("Llego mensaje: " + comando + " - derivado a port : " + socket.getPort());
            
            DataOutputStream output = new DataOutputStream(socket.getOutputStream());
            String respuesta = "Ok\r";
            output.write(respuesta.getBytes(/*new Charset("ISO-8859-1")*/));
            socket.close(); // Cierro la conección con el cliente.
            
            if (comando.startsWith("\r")) {
                MainServer.Parar();
            } else {
                Main ppal = new Main();
                MainServer.enviarEstado("Ejecutando: "+comando);
                int resultado = ppal.despachador(comando.split(" ")); // Llamo al main del traductor pasandole los argumentos
                //int resultado = ppal.simulador(comando.split(" ")); // Llamo al simulador
                switch (resultado) {
                    case 0:// Ok de maestro u operativo
                        MainServer.enviarEstado("Comando: "+comando+" Finalizado con éxito");
                        MainServer.enviarResulado("Finalizado con éxito");
                        break;
                    case 1://Ok de pallets
                        MainServer.enviarEstado("Comando: "+comando+" Finalizado con éxito");
                        MainServer.enviarResuladoPallet("Finalizado con éxito");
                        break;
                    case -1:// error opException
                        MainServer.enviarEstado("Comando: "+comando+" Finalizado con error 4D");
                        MainServer.enviarResulado("Finalizado con error 4D");
                        MainServer.enviarResuladoPallet("Finalizado con error 4D"); // cuando da error seteo los dos por las dudas, no jode y seguro sale del loop que este
                        break;
                    case -2://error Exception
                        MainServer.enviarEstado("Comando: "+comando+" Finalizado con error genérico");
                        MainServer.enviarResulado("Finalizado con error genérico");
                        MainServer.enviarResuladoPallet("Finalizado con error genérico"); // cuando da error seteo los dos por las dudas, no jode y seguro sale del loop que este
                        break;
                }
            }
            
            this.activo = false; // esto debería estar sincronizado.
        } catch (IOException e) {
            miLogger.error("Error al tratar de cerrar la comunicación con el socket. (" + socket.getInetAddress() + ":" + socket.getPort() + ")");
            throw new RuntimeException(e);
        }
    }
    
    public boolean isActivo() {
        return this.activo;
    }
    
    public Socket getSocket() {
        return this.socket;
    }
}
